package com.xuxueli.applyModules.listener;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.xuxueli.applyModules.exception.ErrorException;
import com.xuxueli.applyModules.entity.DemoExcel;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.util.Map;

@Slf4j
public class EasyExcelListener extends AnalysisEventListener<DemoExcel> {

    //校验模板
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
         /*
        count 记录模板表头有几个，用以判断用户导入的表格是否和模板完全一致
        如果用户导入表格较模板的表头多，但其余符合模板，这样不影响则不需要
         */
        int count = 0;
        // 获取数据实体的字段列表
        Field[] fields = DemoExcel.class.getDeclaredFields();
        // 遍历字段进行判断
        for (Field field : fields) {
            // 获取当前字段上的ExcelProperty注解信息
            ExcelProperty fieldAnnotation = field.getAnnotation(ExcelProperty.class);
            // 判断当前字段上是否存在ExcelProperty注解
            if (fieldAnnotation != null) {
                ++count;
                // 存在ExcelProperty注解则根据注解的index索引到表头中获取对应的表头名
                String headName = headMap.get(fieldAnnotation.index());
                // 判断表头是否为空或是否和当前字段设置的表头名不相同
                if (StringUtils.isEmpty(headName) || !headName.equals(fieldAnnotation.value()[0])) {
                    // 如果为空或不相同，则抛出异常不再往下执行
                    throw new ErrorException(500,"模板错误，请检查导入模板");
                }
            }
        }

    }

    //校验数据
    @Override
    public void invoke(DemoExcel excel, AnalysisContext context) {
        Integer rowIndex = context.readRowHolder().getRowIndex();
        String str = "第" +rowIndex+ "行";
        if (StringUtils.isEmpty(excel.getName())) {
            throw new ErrorException(500,str + "姓名不能为空");
        }
        if (StringUtils.isEmpty(excel.getAge())) {
            throw new ErrorException(500,str +"年龄不能为空");
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    }


}

